#ifndef TCPMGR_H
#define TCPMGR_H

#include "global.h"
#include "singleton.h"

#include <QObject>
#include <memory>
#include <QTcpSocket>
#include <QString>
#include <QByteArray>
#include <QMap>


class TcpMgr : public QObject, public Singleton<TcpMgr>, public std::enable_shared_from_this<TcpMgr>
{
    Q_OBJECT

public:
    TcpMgr();

private:
    void initHandlers(); // 注册对应的回调函数
    QMap<ReqId, std::function<void(ReqId id, int len, QByteArray data)>> _handlers;
    // QMap<ReqId, void (*)(ReqId id, int len, QByteArray data)> _handlers; // 函数指针是不太行的，哈哈哈

    void handleMsg(ReqId id, int len, QByteArray data); // 处理请求

    QTcpSocket _socket;
    QString _host;
    uint16_t _port;

    QByteArray _buffer;
    bool _b_recv_pending;
    quint16 _message_id;
    quint16 _message_len;

signals:
    void sig_con_success(bool bsuccess); // TcpMgr 向 ChatServer 发送连接请求
    void sig_send_data(ReqId resId, QString data);
    void sig_login_failed(int errcode); // 登陆失败的处理
    void sig_login_success(); // 登陆成功的处理，发送信号给MainWindow跳转到聊天界面

public slots:
    void slot_tcp_connect(ServerInfo ChatServer); // tcp 建立和 ChatServer 的长连接
    void slot_send_data(ReqId reqId, QString data); // 发送数据
};

#endif // TCPMGR_H
